#include "stm32f10x.h"
#include "delay.h"
#include "OLED.h"
#include "Motor.h"
#include "LED.h"
#include "USART.h"
#include <string.h>
#include <stdlib.h>

// 简化的状态定义
typedef enum
{
    STATE_NO_LINE, // 无红线
    STATE_HAS_LINE // 有红线
} LineState_TypeDef;

// 全局变量
LineState_TypeDef current_state = STATE_NO_LINE;
uint32_t last_command_time = 0;
uint32_t current_time = 0;
uint32_t display_timer = 0;

// 简化的命令解析结构
typedef struct
{
    char cmd[10];
    int value;
} Command_TypeDef;

// 函数声明
void parse_simple_command(char *data, Command_TypeDef *cmd);
void handle_red_detected(void);
void handle_no_red(void);
void update_display(void);

int main(void)
{
    // 初始化所有模块
    OLED_Init();
    Motor_Init();
    LED_Init();
    USART_Config();

    // 显示启动信息
    OLED_ShowString(1, 1, "Simple Red Car");
    OLED_ShowString(2, 1, "Red Line: NONE");
    OLED_ShowString(3, 1, "Motor: STOP");
    OLED_ShowString(4, 1, "Data: Waiting");

    // 绿色LED表示系统就绪
    LED_GreenOn();
    LED_RedOff();

    last_command_time = 0;
    current_time = 0;
    display_timer = 0;

    while (1)
    {
        current_time++;

        // 定期更新显示
        if (current_time - display_timer >= 50000)
        {
            display_timer = current_time;
            update_display();
        }

        // 检查是否收到OpenMV命令
        if (USART_RxCount > 0)
        {
            char received_data[50];
            Command_TypeDef cmd;

            // 复制接收到的数据
            memset(received_data, 0, sizeof(received_data));
            for (int i = 0; i < USART_RxCount && i < 49; i++)
            {
                received_data[i] = USART_RxBuffer[i];
            }

            // 解析命令
            parse_simple_command(received_data, &cmd);

            // 处理命令
            if (strcmp(cmd.cmd, "RED") == 0 && cmd.value == 1)
            {
                handle_red_detected();
            }
            else if (strcmp(cmd.cmd, "NONE") == 0 || cmd.value == 0)
            {
                handle_no_red();
            }

            // 清空接收缓冲区
            USART_ClearRxBuffer();
            last_command_time = 0; // 重置超时计数
        }

        // 超时保护 - 如果长时间没收到命令则停车
        last_command_time++;
        if (last_command_time > 100000) // 约1秒超时
        {
            handle_no_red();           // 超时当作无红线处理
            last_command_time = 50000; // 防止溢出
        }

        Delay_ms(1); // 添加小延时
    }
}

void parse_simple_command(char *data, Command_TypeDef *cmd)
{
    // 解析格式: "CMD,value\n"
    char *token;

    // 初始化
    memset(cmd->cmd, 0, sizeof(cmd->cmd));
    cmd->value = 0;

    // 获取命令类型
    token = strtok(data, ",");
    if (token != NULL)
    {
        strcpy(cmd->cmd, token);
    }

    // 获取数值
    token = strtok(NULL, ",\r\n");
    if (token != NULL)
    {
        cmd->value = atoi(token);
    }
}

void handle_red_detected(void)
{
    current_state = STATE_HAS_LINE;

    // 有红线，小车直行
    Motor_Forward();

    // 绿色LED表示正常运行
    LED_GreenOn();
    LED_RedOff();
}

void handle_no_red(void)
{
    current_state = STATE_NO_LINE;

    // 无红线，停车
    Motor_Stop();

    // 红色LED表示停止
    LED_RedOn();
    LED_GreenOff();
}

void update_display(void)
{
    // 第1行：标题
    OLED_ShowString(1, 1, "Simple Red Car");

    // 第2行：红线状态
    if (current_state == STATE_HAS_LINE)
    {
        OLED_ShowString(2, 1, "Red Line: YES  ");
    }
    else
    {
        OLED_ShowString(2, 1, "Red Line: NONE ");
    }

    // 第3行：电机状态
    if (current_state == STATE_HAS_LINE)
    {
        OLED_ShowString(3, 1, "Motor: FORWARD");
    }
    else
    {
        OLED_ShowString(3, 1, "Motor: STOP   ");
    }

    // 第4行：接收数据状态
    OLED_ShowString(4, 1, "Rx Count:");
    OLED_ShowNum(4, 10, USART_RxCount, 3);
}
